home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgramD2.iso
/
Borland
/
Borland C++ V5.02
/
EDITSDI.PAK
/
SEARCH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-06
|
7KB
|
275 lines
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (C) 1993-1995 Microsoft Corporation. All Rights Reserved.
//
// MODULE: search.c
//
// PURPOSE: Implement search and replace on an edit buffer.
//
// FUNCTIONS:
// FindReplace- Find and/or replace text in the current document.
// Find - Search for a string in the edit text.
// Replace - Replace the current selection.
// ReplaceAll - To replace all of the matches found in the edit text.
// FWholeWord - Check to see if the match is a whole word.
//
// COMMENTS:
//
#include <windows.h> // required for all Windows applications
#include <ctype.h>
#ifdef WIN16
#include "win16ext.h" // required only for win16 applications
#include <string.h>
#include <stdlib.h>
#endif
#include "globals.h" // prototypes specific to this application
BOOL Find(char *, BOOL, BOOL, BOOL, BOOL);
VOID Replace(char *);
VOID ReplaceAll(char *, char *, BOOL, BOOL);
BOOL FWholeWord(char *, char *, char *, int);
//
// FUNCTION: FindReplace(char*,char*,BOOL,BOOL,BOOL,BOOL,BOOL,BOOL)
//
// PURPOSE: Find and/or replace text in the current document.
//
// PARAMETERS:
// szFind - The string to find.
// szReplace - The string used to replace.
// frt -
// frtFind - Find the string szFind
// frtReplace - Replace the current selection with szReplace
// frtRepAll - Replace all occurances of szFind with szReplace
// fDown - Search down if true, up if false.
// fMatchCase - Match case on a search.
// fWholeWord - Match whole words only.
//
// RETURN VALUE:
// NONE.
//
// COMMENTS:
//
//
VOID FindReplace(
char *szFind, char *szReplace,
FRT frt,
BOOL fDown, BOOL fMatchCase, BOOL fWholeWord)
{
switch (frt)
{
case frtFind:
Find(szFind, fDown, fMatchCase, fWholeWord, FALSE);
break;
case frtReplace:
Replace(szReplace);
break;
case frtRepAll:
ReplaceAll(szFind, szReplace, fMatchCase, fWholeWord);
}
}
//
// FUNCTION: Find(char *, BOOL, BOOL, BOOL, BOOL)
//
// PURPOSE: Search for a string in the edit text.
//
// PARAMETERS:
// szFind - The string to search for.
// fDown - Search from current position to the end of the text.
// fMatchCase- Match the case of the search string.
// fWholeWord- Target must have white space on both sides.
// fNoScroll - Don't scroll the window to the selection.
//
// RETURN VALUE:
// TRUE - String was found.
// FALSE - Search was not sucessful.
//
// COMMENTS:
//
//
BOOL Find
(char *szFind, BOOL fDown, BOOL fMatchCase, BOOL fWholeWord, BOOL fNoScroll)
{
char *szText; // Pointer to edit text
UINT ichStart; // Index of start of selection
UINT ichEnd; // Index of end of selection
UINT cch; // Number of charaters in edit text
int dch; // Number of characters to move (+/-1)
int dchComp;
char *szTerm; // Pointer to terminal point in search
char *sz; // Pointer to current character
UINT cchFind; // Length of find string
BOOL fFound = FALSE; // Found flag
int dchOnFind; //
szText = LockEditText(GetEditWindow());
cchFind = strlen(szFind);
GETSEL(ichStart, ichEnd);
cch = strlen(szText);
if (
ichEnd-ichStart == cchFind &&
!strnicmp(szText+ichStart,szFind,cchFind)
)
dchOnFind = 1;
else
dchOnFind = 0;
if (fDown)
{
dch = 1;
dchComp = 0;
sz = szText + ichStart + dchOnFind;
szTerm = szText + cch;
}
else
{
dch = -1;
dchComp = 1;
sz = szText + ichStart - dchOnFind;
szTerm = szText;
}
for (; sz + dchComp != szTerm; sz += dch)
{
if (
tolower(*sz) == tolower(*szFind) &&
(fMatchCase ?
!strncmp(sz,szFind,cchFind) :
!strnicmp(sz,szFind,cchFind)
) &&
(!fWholeWord || FWholeWord(sz, szText, szTerm, cchFind)))
{
#ifdef WIN16
SendMessage(
GetEditWindow(),
EM_SETSEL,
(WPARAM) fNoScroll,
(LPARAM) MAKELONG(sz-szText,sz-szText+cchFind));
#else
SendMessage(GetEditWindow(), EM_SETSEL, sz-szText, sz-szText+cchFind);
if (!fNoScroll)
SendMessage(GetEditWindow(), EM_SCROLLCARET, 0, 0L);
#endif
fFound = TRUE;
break;
}
}
if (!fNoScroll && !fFound)
MessageBox(NULL, szFind, "String not found", MB_OK);
return fFound;
}
//
// FUNCTION: Replace(char *)
//
// PURPOSE: Replace the current selection.
//
// PARAMETERS:
// szReplace - The string to replace with.
//
// RETURN VALUE:
// NONE
//
// COMMENTS:
//
//
VOID Replace(char *szReplace) {
SendMessage(GetEditWindow(), EM_REPLACESEL, 0, (LPARAM) (LPSTR) szReplace);
}
//
// FUNCTION: ReplaceAll(char *, char *, BOOL, BOOL)
//
// PURPOSE: To replace all of the matches found in the edit text.
//
// PARAMETERS:
// szFind - The string to replace.
// szReplace - The string to replace with.
// fMatchCase - Replace only exact matches.
// fWholeWord - Replace only whole word matches.
//
// RETURN VALUE:
//
// COMMENTS:
//
//
VOID ReplaceAll
(char *szFind, char *szReplace, BOOL fMatchCase, BOOL fWholeWord)
{
UINT ichStart;
UINT ichEnd;
GETSEL(ichStart, ichEnd);
SETSEL(0,0);
while (Find(szFind, TRUE, fMatchCase, fWholeWord, TRUE)) {
Replace(szReplace);
}
SETSEL(ichStart, ichEnd);
}
//
// FUNCTION: FWholeWord(char *, char*, char *, int)
//
// PURPOSE: Check to see if the match is a whole word.
//
// PARAMETERS:
// sz - A pointer to the found string.
// szStart- A pointer to the beginning of the buffer.
// szEnd - A pointer to the end of the buffer.
// cch - The lenght of the found string.
//
// RETURN VALUE:
// TRUE - Whole word.
// FALSE - No a whole word.
//
// COMMENTS:
//
BOOL FWholeWord(char *sz, char *szStart, char *szEnd, int cch) {
// Is the start of the found text preceded by whitespace?
if (
sz != szStart &&
*(sz-1) != ' ' &&
*(sz-1) != '\t' &&
*(sz-1) != ',' &&
*(sz-1) != '.' &&
*(sz-1) != '\r'
) {
return FALSE;
}
// Is the end of the found text followed by whitespace?
if (
sz + cch != szEnd &&
*(sz+cch) != ' ' &&
*(sz+cch) != '\t' &&
*(sz+cch) != ',' &&
*(sz+cch) != '.' &&
*(sz+cch) != '\r'
) {
return FALSE;
}
return TRUE;
}